#pragma once

// 3D方框透视示例源码
// Author: 阿茵Ayin
/*
	免责声明：
	仅供学习交流，如果用来做违f的事情和作者本人无关

	注：（必看）

	WorldToScreen算法用的是列矩，如果你找到的是横距请自行写一个矩阵转置函数

	示例游戏是迷你World，高度轴为Y轴，其他例如cs_go这类Z轴是高度轴的这个算法需要改动

*/

// 必要数学库
#include <cmath>

constexpr float PI() { return 3.1415926535f; }

//一些必要的结构体
typedef struct __Vector2F__ {

	float x;
	float y;

} Vector2F, *PVector2F;

typedef struct __Vector3F__ {

	float x;
	float y;
	float z;

} Vector3F, *PVector3F;

typedef struct __Rotation__ {

	float yaw;
	float pitch;
	float roll;

} Rotation, *PRotation;

typedef struct __Color4F__ {

	float r;
	float g;
	float b;
	float a;

} Color4F, *PColor4F;

// 参数解释
// pvm = Projection View Matrix（投影视图矩阵）
// opc = Origin Point Coordinates
// height 盒子高度
// rotation = 人物姿态
// viewWidth = 视角宽
// viewHeight = 视角高
// angle = 偏移角度
// radius = 方框缩放
// thickness = 方框线条粗细
// transformed = 变换结果

// 求算方框点在偏航角变了之后新的点的位置
bool RotateTransform(float** pvm, Vector3F opc, float angle, int radius, float viewWidth, float viewHeight, Vector2F& transformed);

// 绘制3D方框
bool DrawBox(float** pvm, Vector3F opc, float height, Rotation rotation, float radius, Color4F color, int thickness, float viewWidth, float viewHeight);

// 画线函数，自己拿自己的库和我这个整合下，或者自己改下算法代码
void DrawLine(Vector2F from, Vector2F to, float thickness, Color4F color);
